////////////////////////////////////////////////////////////////////////////////

#ifndef _ENGINE_H_
#define _ENGINE_H_

////////////////////////////////////////////////////////////////////////////////

#include <vector>

////////////////////////////////////////////////////////////////////////////////

#include "timer.h"
#include "battlefield.h"

////////////////////////////////////////////////////////////////////////////////


/** Game engine
*
*  @author   Roman Pasechnik
*  @since    Jun 04th, 2009
*  @updated  Jun 05th, 2009
*/
class Engine
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    Engine();


    /** Destructor */
    virtual ~Engine();


////////////////////////////////////////////////////////////////////////////////


    /** Engine events */
    enum Event
    {
        INVALID,

        W_DOWN,          // "W" button pressed
        W_UP,            // "W" button released
        S_DOWN,
        S_UP,
        A_DOWN,
        A_UP,
        D_DOWN,
        D_UP,
        MOUSE1_DOWN,
        MOUSE1_UP
    };


////////////////////////////////////////////////////////////////////////////////


    /** Process engine events */
    void ProcessEvent( Event event );


    /** Process mouse motion */
    void ProcessMouseMotion( int x, int y );


    /** Process engine logic */
    void ProcessLogic();


    /** Access battle arena information */
    const Battlefield& GetBattlefield() const;


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Process collisions logic */
    void ProcessCollisions();


    /** Process movement logic */
    void ProcessMovement();


    /** Process shooting logic */
    void ProcessShooting();


    /** Battle arena */
    Battlefield m_Battlefield;


    /** Key flags */
    unsigned int m_KeyFlags;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

